hclass Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        int pre_sum = 0;
        int ans = 0;
        map<int, int> m;

        /*
        首先，先来一个例子，假设k = 2
                    3  2  2  1  1   3
        前缀和--->   3  5  7  8  9  12
        我们这个过程是边计算前缀和边判断的，怎么个判断法呢?
        每当得出一个前缀和pre_sum，计算pre_sum - k在map中的值，把计算出来的值累加至ans就是本题结果
        比如， 3 - k = 1，1此时在map中为0；然后把3在map中的值加一变为1
        继续， 5 - k = 3，3此时在map中为1；说明5这个前缀和之前有一个3，正因为有这个3，才可以累加到5，然后把5在map中的值加一变为1
        以此类推

        但是这样还不对，有一个例子，假设k = 2
         1   1   1
         1   2   3   -- 前缀和
         1   1   1   -- 对应前缀和在map中的次数
        1-k 2-k 3-k  -- 前缀和-k，对应上面的pre_sum-k
        此时会发现：只有3-k == 1--->在map中次数为1，但是1 + 1也是等于k的，也就是2-k == 0，这个0也应该提前被放入map中，并且对应次数为1 

           1   1   1
        0  1   2   3   -- 前缀和
        1  1   1   1   -- 对应前缀和在map中的次数
          1-k 2-k 3-k  -- 前缀和-k，对应上面的pre_sum-k

        这样就有2-k，和3-k的结果都在map中且次数为1
        */
        for(int i = 0; i < nums.size(); i++)
        {  
            m[pre_sum]++;
            pre_sum += nums[i];
            ans += m[pre_sum - k];
        }

        return ans;
    }
};